
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Linux安全三剑客 权限管理、SELinux与防火墙 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Linux安全三剑客 权限管理、SELinux与防火墙 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Linux的“三位一体”权限模型指的是什么？它如何应用于文件所有者、所属组和其他用户？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“三位一体”权限模型指的是：1. 用户权限（User）：文件所有者拥有的权限。2. 组权限（Group）：文件所属用户组的成员拥有的权限。3. 其他用户（Others）：不属于以上两者的其他所有人拥有的权限。这三者共同构成了Linux的基础文件权限系统。</div>
          </div>
          <div class="card-source">来源: 1.1 三位一体的权限模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">操作</div>
          <div class="card-question">在部署Java应用时，为什么直接使用 `chmod 777` 是一个危险的操作？文档推荐的正确做法是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">操作</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">直接使用 `chmod 777` 会给予系统中的所有用户（所有者、组、其他）对文件的读、写、执行全部权限，这是一种危险的全开放权限设置。文档推荐的正确做法是：为应用创建专门的用户（如javaapp），使用 `chown` 命令设置文件所有者和组，并使用更严格的权限（如 `chmod 750`），仅为用户和组授予必要的权限，而禁止其他用户访问。</div>
          </div>
          <div class="card-source">来源: 1.2 权限实战：部署Java应用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当传统的文件权限模型（用户/组/其他）无法满足需求，例如需要为特定用户（如审计员）授予访问权限时，应该使用什么技术？请举例说明如何操作。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当传统权限模型无法满足需求时，应使用ACL（访问控制列表）扩展权限。例如，要允许名为 `auditor` 的用户读取特定日志文件，可以使用命令 `setfacl -m u:auditor:r /var/log/javaapp.log`。</div>
          </div>
          <div class="card-source">来源: 2.1 ACL应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">SELinux中的“安全上下文”由哪四个主要字段组成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SELinux的安全上下文由四个字段组成，分别是：用户（User）、角色（Role）、类型（Type）和级别（Level）。例如，一个Java进程的上下文可能是 `system_u:system_r:tomcat_t:s0`。</div>
          </div>
          <div class="card-source">来源: 3.1 安全上下文解密</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">操作</div>
          <div class="card-question">如果一个Java应用因为SELinux策略而无法绑定到非标准端口（如8081），应该如何解决？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">操作</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用 `semanage` 命令来解决。具体操作是使用 `semanage port -a -t http_port_t -p tcp 8081` 命令，将该非标准端口（8081）添加到SELinux策略中 `http_port_t` 类型所允许的TCP端口列表里。</div>
          </div>
          <div class="card-source">来源: 3.2 企业级SELinux配置案例</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当需要为自定义服务创建SELinux策略时，如何从审计日志（audit.log）生成策略文件并进行编译安装？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以分两步进行：1. 使用 `audit2allow -i audit.log > myapp.te` 命令从审计日志中生成类型强制（.te）策略文件。2. 使用 `checkmodule`、`semodule_package` 和 `semodule -i myapp.pp` 等一系列命令来编译策略模块并安装到系统中。</div>
          </div>
          <div class="card-source">来源: 4.1 自定义策略模块开发</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">firewalld中的“区域”（Zone）是什么核心概念？请列举并说明`public`和`internal`区域的适用场景。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“区域”（Zone）是firewalld的核心概念，用于根据网络的信任级别定义不同的安全规则集。`public`区域适用于公共网络，是默认设置；`internal`区域适用于受信任的内网环境。</div>
          </div>
          <div class="card-source">来源: 5.1 firewalld核心概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">操作</div>
          <div class="card-question">除了简单地开放端口，`firewall-cmd`如何实现更高级的访问控制，例如只允许特定IP地址段访问某个端口？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">操作</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用富规则（rich rule）来实现。例如，要只允许 `192.168.1.0/24` 网段访问TCP 8080端口，可以使用命令：`firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080" accept'`。</div>
          </div>
          <div class="card-source">来源: 5.2 Java应用防火墙配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技巧</div>
          <div class="card-question">在紧急排错时，如果怀疑SELinux是问题的根源，可以采取什么临时措施？该操作有何风险？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技巧</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以执行 `setenforce 0` 命令，将SELinux临时切换到Permissive（宽容）模式。在这种模式下，SELinux不会阻止任何操作，只会记录违规行为。文档特别指出，此操作在生产环境中应谨慎使用。</div>
          </div>
          <div class="card-source">来源: 4.2 应急处理技巧</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
